package com.lh.pattern.obvious;

import java.util.ArrayList;
import java.util.List;

public class ObserverTest {
	/**
	 * 观察者模式测试类
	 */
	public static void main(String[] args) {
		ObserverRole observerRole1 = new Observer1();
		ObserverRole observerRole2 = new Observer2();
		ObserverRole observerRole3 = new Observer3();

		DogTarget dogTarget = new DogTarget();// 实例一个被观察者
		dogTarget.addObserver(observerRole1);// 给被观察者添加观察者1，完成关门动作
		dogTarget.addObserver(observerRole2);// 给被观察者添加观察者2，完成打狗动作
		dogTarget.addObserver(observerRole3);// 给被观察者添加观察者3，完成打狗动作
		dogTarget.comeIn("笨笨"); // 被观察者进入，它的观察者采取行动
	}
}

/**
 * 抽象观察者角色
 */
interface ObserverRole {
	/**
	 * 观察者接到通过之后做一系列业务操作
	 */
	void doOperate(String dogName);

}

/**
 * 具体观察者角色1
 */
class Observer1 implements ObserverRole {

	@Override
	public void doOperate(String dogName) {
		System.out.println("观察者1-关住" + dogName);
	}
}

/**
 * 具体观察者角色2
 */
class Observer2 implements ObserverRole {
	@Override
	public void doOperate(String dogName) {
		System.out.println("观察者2-打狗" + dogName);
	}
}

/**
 * 具体观察者角色3
 */
class Observer3 implements ObserverRole {

	@Override
	public void doOperate(String dogName) {
		System.out.println("观察者3-很打狗" + dogName);
	}
}

/**
 * 抽象目标角色
 */
interface TargetRole {
	/**
	 * 添加观察者
	 */
	void addObserver(ObserverRole observerRole);

	/** 移除观察者 */
	void removeObserver(ObserverRole observerRole);

	/**
	 * 通知所有观察者
	 */
	void notifyObserver(String dogName);
}

/**
 * 具体目标角色
 */
class DogTarget implements TargetRole {

	List<ObserverRole> observerRoles = new ArrayList<ObserverRole>();

	@Override
	public void addObserver(ObserverRole observerRole) {
		observerRoles.add(observerRole);
	}

	@Override
	public void notifyObserver(String dogName) {
		for (ObserverRole observer : observerRoles) {
			observer.doOperate(dogName);// 观察者做出操作
		}
	}

	@Override
	public void removeObserver(ObserverRole observerRole) {
		observerRoles.remove(observerRole);
	}

	/**
	 * 狗进门了
	 */
	public void comeIn(String dogName) {
		notifyObserver(dogName);// 通知所有的观察者
	}

}